/*
 * A72_cmd.h
 *
 *  Created on: Mar 16, 2024
 *      Author: 25119
 */

#ifndef A72_CMD_H_
#define A72_CMD_H_

#include <stdint.h>
#include <stdbool.h>
#include <string.h>

#include "usart.h"
#ifdef USE_FREERTOS
#include "cmsis_os2.h"
#define DELAY_MS(ms) osDelay(ms)
#else
#define DELAY_MS(ms) HAL_Delay(ms)
#endif

#define UART_TIMEOUT 10
#define A72_UART_RX_BUF_MAX 59

typedef struct
{
  uint16_t addr;
  uint16_t len;
  uint8_t data[A72_UART_RX_BUF_MAX];
  uint8_t done;
}A72_rx_buf;

extern A72_rx_buf rx_buf;

extern const uint8_t C_A72_T_reboot[];
extern const uint8_t C_A72_T_restore[];

extern const uint8_t C_A72_T_read_address[];
extern const uint8_t C_A72_R_read_address[];

extern const uint8_t C_A72_T_read_program_info[];
extern const uint8_t C_A72_R_read_program_info[];

extern const uint8_t C_A72_T_read_net_statue[];
extern const uint8_t C_A72_R_read_net_statue[];

extern const uint8_t C_A72_T_get_gateway_info[];
extern const uint8_t C_A72_R_get_gateway_info[];

extern const uint8_t C_A72_T_set_gateway_network_key;
extern uint8_t C_A72_T_set_gateway_info[];

extern const uint8_t C_A72_T_start_scan[];
extern const uint8_t C_A72_R_start_scan[];

extern const uint8_t C_A72_T_stop_scan[];

extern const uint8_t C_A72_T_filter_addr[];

extern const uint8_t C_A72_T_node_param_cfg_1[];
extern const uint8_t C_A72_T_node_param_cfg_2[];
extern const uint8_t C_A72_R_node_param_cfg[];

extern const uint8_t C_A72_T_node_bind[];
extern const uint8_t C_A72_R_node_bind[];

extern const uint8_t C_A72_T_delete_node_1[];
extern const uint8_t C_A72_T_delete_node_2[];
extern const uint8_t C_A72_R_delete_node_1[];
extern const uint8_t C_A72_R_delete_node_2[];

extern const uint8_t C_A72_T_group_addr_1;
extern const uint8_t C_A72_T_group_op_code;
extern const uint8_t C_A72_T_add_group_op_code;
extern const uint8_t C_A72_T_delete_group_op_code;
extern const uint8_t C_A72_T_delete_all_group_op_code;
extern const uint8_t C_A72_T_group_addr_2;
extern const uint8_t C_A72_T_group_group;
extern const uint8_t C_A72_T_group_others;
extern const uint8_t C_A72_T_group_others_1[]; //add or delete
extern const uint8_t C_A72_T_group_others_2[]; //delete all
extern uint8_t C_A72_T_group[];

extern const uint8_t C_A72_T_uart_tx[];

extern const uint8_t C_A72_R_gateway_uart_rx_1[];
extern const uint8_t C_A72_R_gateway_uart_rx_2[];

extern const uint8_t C_A72_R_node_uart_rx[];

extern int A72_tx_cmd(UART_HandleTypeDef *huart, const uint8_t *cmd);
extern int A72_rx_cmd(UART_HandleTypeDef *huart, uint8_t *cmd);
extern int A72_cmd_cmp(uint8_t *cmd_rx, const uint8_t *cmd_std);

int rx_cmd_handle(UART_HandleTypeDef *huart);
int A72_rx_cmd_it(UART_HandleTypeDef *huart, uint8_t *cmd, uint32_t time_out);
int A72_rx_cmd_long_time(UART_HandleTypeDef *huart, uint8_t *cmd, uint32_t time_out);

int A72_tx_uart(UART_HandleTypeDef *huart, uint16_t addr, uint8_t *p_data, uint8_t len, uint32_t time_out);

extern int A72N_reboot(void);
extern int A72N_restore(void);

//const unsigned char A72_BLE_MESH_COMMANDS[][10] =
//{
//{0x01, 0xFF, 0x01}, // 重启模块，参数: 01
//{0x01, 0xFF, 0x02}, // 读取地址，参数: 02，模块返回：0A 00，命令: 93 02，MAC地址：6字节，单播地址：2字节
//{0x01, 0xFF, 0x03}, // 程序信息，参数: 03，模块返回：06 00，命令: 93 03，设备类型：2字节，程序版本：2字节
//{0x01, 0xFF, 0x04}, // 入网状态，参数: 04，模块返回：03 00，命令: 93 04，入网状态：1字节
//
//{0xE9, 0xFF, 0x02}, // 恢复出厂设置，参数: 02
//{0xE9, 0xFF, 0x0C}, // 读取网关信息，参数: 0C
///* 模块返回 */{0x1C, 0x00, 0x91, 0x8B, /* 剩余的数据 */},
//                    // 模块返回：1C 00，命令: 91 8B，入网状态：1字节
//                    // 网络密钥：16字节，KEY_INDEX：2字节，IV_UPDATE_FLAG：1字节
//                    // IV_INDEX：4字节，最终单播地址：2字节
//
//{0xE9, 0xFF, 0x09, /* 手动填入网络密钥 16字节 */},
//                    // 设置网关信息1，子命令: 09，网络密钥 16字节
///* 接着前面 */{0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, 0x01, 0x00},
//                    // 设置网关信息2，KEY_INDEX：00 00，IV_UPDATE_FLAG：00
//                    // IV_INDEX：11 22 33 44，网关地址：01 00
//
//{0xE9, 0xFF, 0x0D, 0x01, 0x00, /* 手动填入DEVICE_KEY: 16字节 */},
//                    // 设置网关 DEVICE_KEY，子命令: 0D，网关地址: 01 00，DEVICE_KEY: 16字节
//
//{0xE9, 0xFF, 0x00}, // 扫描节点，子命令: 00，停止扫描: E9 FF 01
///* 模块返回 */{0x24, 0x00, 0x91, 0x88, /* 剩余的数据 */},
//                    // 模块返回：24 00，命令: 91 88，MAC地址：6字节，其他广播数据：28字节
//
//{0xE9, 0xFF, 0x08, /* 手动填入MAC地址 6字节 */}, // 设置广播地址过滤，子命令: 08，MAC地址：6字节
//
//{0xE9, 0xFF, 0x0A, /* 手动填入网络密钥 16字节 */}, // 配置节点参数1，子命令: 0A，网络密钥: 16字节
///* 接着前面 */{0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, /* 手动填入单播地址：2字节 */},
//                  // 配置节点参数2，KEY_INDEX：00 00，IV_UPDATE_FLAG：00
//                  // IV_INDEX：11 22 33 44，单播地址：2字节
///* 模块返回 */{0x1B, 0x91, 0x89, /* 剩余的数据 */},
//                  // 模块返回：1B 00，命令: 91 89，入网状态：1字节，其他广播数据：22字节
//
//{0xE9, 0xFF, 0x0B, 0x00, 0x00, 0x00, /* 手动填入APP_KEY: 16字节 */},
//                  // 绑定，子命令: 0B，快速绑定：00，KEY_INDEX：00 00，APP_KEY：16字节
///* 模块返回 */{0x03, 0x00, 0x91, 0x82, /* 绑定状态 */},
//                  // 模块返回：03 00，命令: 91 82，绑定状态：1字节（00表示绑定成功）
//
///* 后面的不想写了…… */
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, // 删除节点，单播地址: 2字节，OP_CODE: 80 49
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01}, // 获取节点状态，目标地址: FF FF，OP_CODE: 82 4B
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01}, // 添加组，单播地址: 2字节，OP_CODE: 80 1B
//                                                  //  单播地址: 2字节，组号：1字节，其他数据：C0 00 10
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01}, // 删除组，单播地址: 2字节，OP_CODE: 80 1C
//                                                  //  单播地址: 2字节，组号：1字节，其他数据：C0 00 10
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01}, // 删除所有组，单播地址: 2字节，OP_CODE: 80 1D
//                                                  //  单播地址: 2字节，其他数据：00 10
//
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, // 开灯，需回复节点数: 1字节，目标地址: 2字节，OP_CODE: 82 02，其他数据: 01 00
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, // 关灯，需回复节点数: 1字节，目标地址: 2字节，OP_CODE: 82 02，其他数据: 00 00
//{0xE8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, // 亮度设置，需回复节点数: 1字节，目标地址: 2字节，OP_CODE: 82 4C，亮度: 2字节
//
//{0x00, 0xFF}, // 无线数据发送，目标地址: 2字节，用户数据: N字节
//
///* 网关无线数据接收1 */{/* 长度：2字节 */ 0x91, 0x80},
///* 网关无线数据接收2 */ /* 源地址：2字节 */
///* 网关无线数据接收3 */{0x01, 0x00, 0x52, /* 用户数据：N字节 */},
//
//{0x02, 0xFF}, // 网关发送节点透传，目标地址: 2字节，用户数据: N字节
//{0x91, 0x81}, // 网关无线数据接收，源地址: 2字节，目标地址: 01 00，OP_CODE: 52，用户数据: N字节
//{0x93, 0x00}, // 节点无线数据接收，用户数据: N字节
//};

#endif /* A72_CMD_H_ */
